package com.netty.bio;

import com.concurrent.demo.Allocator;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

/**
 * @Date 2021/8/31 12:25
 * @Author WangLinBao
 * @Description
 */
public class SocketServer {

    public static void main(String[] args) throws IOException {
        //启动一个socket服务
        ServerSocket socket = new ServerSocket(9000);
        while(true) {//处理完一个连接后继续执行到等待客户端连接的代码
            System.out.println("等待客户端连接");
            Socket accept = socket.accept();
            //处理连接 可以使用多线程处理消息 前提不会有很多进行数据交互的连接，否则线程创建过多
            System.out.println("=============");
            handler(accept);//执行完后继续循环等待客户端连接 因此,此处处理可以使用异步的方式
            //如果使用新线程处理,连接特别多,会创建太多线程 内存爆掉 可以用mq,但又不能保证并发和实时性
        }
    }

    private static void handler(Socket clientSocket) throws IOException {
        byte[] bytes = new byte[1024];
//        while(true){
            //获取到socket中的输入流并读取数据 将会阻塞到直到接收到客户端数据
            int read = clientSocket.getInputStream().read(bytes);
            System.out.println("read完毕.....");
            if(read!=-1){
                System.out.println("接收到的客户端数据： " + new String(bytes,0,read));
            }
            //获取到输出流并写入数据，其实会写到buffer缓存中 需要flush才会发送出去
            clientSocket.getOutputStream().write("HelloClient...\n".getBytes());
            clientSocket.getOutputStream().flush();
//        }
    }
}
